package ln.javatest.day16.demo01;
/*
文件上传案例的客户端：读取本地文件，上传到服务器，读取服务器回写的数据
明确：
    数据源：D:\桌面\Java笔记\1.txt
    目的地：服务器
实现步骤：
    1.创建一个本地字节输入流FileInputStream对象，构造方法中绑定要读取的数据源
    2.创建一个客户端Socket对象，构造方法中绑定服务器的IP地址和端口号
    3.使用Socket中的方法getOutputStream,获取网络字节输出流OutputStream对象
    4.使用本地字节输入流FIleInputStream对象中的方法read，读取本地文件
    5.使用网络字节输出流OutputStream对象中的方法write，把读取到的文件上传到服务器
    6.使用Socket中的方法getInputStream，获取网络字节输入流InputStream对象
    7.使用网络字节输入流InputStream对象中的方法read读取服务器端回写的数据
    8.释放资源（FileInputStream，Socket）
注意：由于read读取本地文件，结束标记while循环那里不会把读取到的-1写进服务器，所以服务器读取不到文件的结束标记
     read方法便会进入到阻塞状态，一直死循环等待结束标记，那么while循环后的代码就不会执行到
     解决方案：
        上传完文件，给服务器写一个结束标记
        void shutdownOutput（） 禁用此套接字的输出流。
            对于TCP套接字，任何以前写入的数据都将被发送，并且后跟TCP的正常连接终止序列
*/

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;

public class FileUp {
    public static void main(String[] args) throws IOException {
        //1.创建一个本地字节输入流FileInputStream对象，构造方法中绑定要读取的数据源
        FileInputStream fis = new FileInputStream("D:\\桌面\\Java笔记\\1.txt");
        //2.创建一个客户端Socket对象，构造方法中绑定服务器的IP地址和端口号
        Socket s = new Socket("127.0.0.1",8024);
        //3.使用Socket中的方法getOutputStream,获取网络字节输出流OutputStream对象
        OutputStream os = s.getOutputStream();
        //4.使用本地字节输入流FIleInputStream对象中的方法read，读取本地文件
        int len = 0;
        byte[] bytes = new byte[1024];
        while((len = fis.read(bytes))!= -1){
            //5.使用网络字节输出流OutputStream对象中的方法write，把读取到的文件上传到服务器
            os.write(bytes,0,len);
        }
        /*
        解决方案：
        上传完文件，给服务器写一个结束标记
        void shutdownOutput（） 禁用此套接字的输出流。
            对于TCP套接字，任何以前写入的数据都将被发送，并且后跟TCP的正常连接终止序列
        */
        s.shutdownOutput();
        //6.使用Socket中的方法getInputStream，获取网络字节输入流InputStream对象
        InputStream is = s.getInputStream();
        //7.使用网络字节输入流InputStream对象中的方法read读取服务器端回写的数据
        while((len = is.read(bytes))!= -1){
            System.out.println(new String(bytes,0,len));
        }
        //8.释放资源（FileInputStream，Socket）
        fis.close();
        s.close();
    }
}
